맨위로가기

환경 변수

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

환경 변수는 프로세스에 부속된 데이터로, 변수명과 값으로 구성되어 프로세스의 동작 방식에 영향을 미친다. 환경 변수는 "변수명=값" 형태로 표기되며, 변수명은 영문자, 숫자, 언더스코어로 구성되고 값은 문자열이다. 각 프로세스는 여러 환경 변수를 가질 수 있으며, 환경은 부모 프로세스에서 자식 프로세스로 상속된다. 환경 변수는 시스템, 사용자 정의, 프로그램별, 또는 대부분의 프로그램에 영향을 주는 것 등 다양하다. C언어에서는 ANSI 및 ISO 표준에 의해 공통 확장 기능이 규정되어 있으며, UNIX 셸에는 환경 변수와 유사한 셸 변수가 존재한다.

Windows에서는 `SET` 명령어를 통해 환경 변수를 확인하고 설정하며, 변수 앞뒤에 `%` 기호를 붙여 사용한다. macOS와 Linux에서는 `env`, `set`, `printenv` 명령어를 사용해 환경 변수를 확인하고, `export` (bash) 또는 `setenv` (csh)를 사용해 변수를 설정한다. 주요 환경 변수로는 `PATH`, `HOME`, `PWD`, `DISPLAY`, `LD_LIBRARY_PATH` 등이 있다.

환경 변수는 시스템 환경 변수와 사용자 환경 변수로 나뉘며, 시스템 환경 변수는 시스템 전체에 적용되어 운영에 중요한 역할을 하고, 사용자 환경 변수는 특정 사용자 계정에만 적용되어 각 사용자의 작업 환경을 설정하는 데 사용된다. 환경 변수는 소프트웨어 실행, 개발 환경 설정, 시스템 관리 등 다양한 분야에서 활용되며, 특히 개발 환경 설정 시 개발 도구의 경로, 라이브러리 경로, 컴파일러 옵션 등을 설정하는 데 유용하다. 또한, 소프트웨어 실행 시 필요한 라이브러리 경로와 설정 파일 경로 등을 파악하고, 시스템 관리 시 시스템 설정을 관리하고 자동화를 구성하는 데 활용된다.

HTTP 환경 변수는 웹 서버가 HTTP 요청 헤더의 정보를 프로그램에 전달하기 위해 사용되며, 클라이언트 IP 주소, 사용자 에이전트 정보 등을 포함한다. 환경 변수는 보안상 민감한 정보를 저장하지 않도록 주의해야 하며, 특히 기밀 정보를 애플리케이션에 전달하는 데 사용될 수 있다.

2. 환경 변수란 무엇인가?

환경 변수는 각 프로세스에 부속되는 데이터 모음으로, 하나의 프로세스는 여러 개의 환경 변수를 가질 수 있다.[3][4] 어떤 프로세스에 속한 환경 변수 전체를 환경이라고 부르기도 한다. 기본적으로 프로세스가 생성될 때, 부모 프로세스의 환경을 복제하여 상속받는다. 즉, 자식 프로세스가 특별히 환경을 변경하지 않는 한 부모와 동일한 환경을 가지게 되며, 자식 프로세스에서 환경을 변경해도 부모 프로세스에는 영향을 미치지 않는다.

환경 변수는 일반적으로 '변수명=값' 형태로 구성되며, 변수명과 값 모두 보통 단순한 문자열이다. 변수명은 주로 영문자, 숫자, 밑줄(_)로 이루어지며, 유닉스 계열 운영체제에서는 대소문자를 구분하지만 도스, OS/2, 윈도우에서는 구분하지 않는다. 관례적으로 환경 변수 이름은 모두 대문자로 사용하는 경우가 많다. 값은 특별한 데이터 형식이 정해져 있지 않지만, 특정 프로그램이 해석할 때는 콜론(:)이나 세미콜론(;)으로 구분된 목록과 같은 특정 구조를 가질 수 있다.

프로세스는 환경 변수를 참조하여 필요한 정보를 얻거나 자신의 동작 방식을 변경할 수 있다. 예를 들어, 셸 스크립트배치 파일은 환경 변수를 사용하여 자식 프로세스에게 설정이나 데이터를 전달하는 용도로 활용한다.

환경 변수를 참조하는 방식은 시스템마다 차이가 있다.


  • 도스윈도우 시스템에서는 변수 이름 양쪽에 퍼센트 기호(%)를 붙여 사용한다. 예를 들어, 프로그램 검색 경로를 나타내는 `PATH` 변수는 `%PATH%`와 같이 참조한다.
  • 유닉스유닉스 계열 시스템에서는 변수 이름 앞에 달러 기호($)를 붙여 사용한다. 예를 들어, `PATH` 변수는 `$PATH`와 같이 참조한다.


환경 변수에는 시스템이 미리 정의해 둔 것과 사용자가 직접 정의하는 것이 있으며, 대부분의 프로그램에 영향을 주는 변수와 특정 프로그램에만 영향을 주는 변수가 있다. 예를 들어, 유닉스에서는 시스템 시작 시 init 시작 스크립트에 의해 기본적인 환경 변수가 설정되고, 사용자는 자신의 셸 프로필 스크립트를 통해 이를 추가하거나 변경할 수 있다. 윈도우에서는 환경 변수의 기본값이 윈도우 레지스트리에 저장되거나 `AUTOEXEC.BAT` 파일에서 설정된다.

3. 환경 변수 보기 및 설정

환경 변수는 명령줄이나 스크립트 내에서 특정 값을 저장하고 참조하는 데 사용된다. 일반적으로 변수 이름 앞이나 뒤에 `%`(윈도우) 또는 `$`(유닉스 계열) 같은 특수 기호를 붙여 그 값을 불러온다.[1][2] 예를 들어, 시스템의 실행 파일 검색 경로를 담고 있는 `PATH` 변수의 값은 윈도우에서는 `echo %PATH%` 명령으로, 유닉스 계열에서는 `echo $PATH` 명령으로 확인할 수 있다.

환경 변수 이름은 관례적으로 모두 대문자로 작성하는 경우가 많으며, 이는 코드 내에서 일반 변수와 구분하기 쉽게 하기 위함이다. 유닉스 계열 운영체제에서는 환경 변수 이름의 대소문자를 구분하지만, 도스, OS/2, 윈도우에서는 구분하지 않는다.[5]

대부분의 운영체제는 명령줄 인터페이스를 통해 현재 설정된 환경 변수 목록 전체를 확인하거나, 특정 변수의 값을 설정 또는 해제하는 기능을 제공한다. 예를 들어, 윈도우에서는 `SET` 명령어를, 유닉스 계열에서는 `env`, `set`, `printenv` 등의 명령어를 사용하여 변수 목록을 확인할 수 있다.[1][2][3] 변수를 설정할 때는 `SET` (윈도우), `export` 또는 `setenv` (유닉스 계열) 등의 명령어를 사용하며,[1][4] 변수를 해제하는 명령어(`SET 변수=` 또는 `unset`)도 존재한다.[4] 각 운영체제별 구체적인 명령어 사용법은 하위 섹션에서 자세히 다룬다.

환경 변수는 다음과 같은 중요한 특징을 가진다.


  • 로컬성: 환경 변수는 설정된 프로세스 내에서만 유효하다. 한 에서 변경한 환경 변수 값은 다른 셸에 영향을 주지 않는다.
  • 상속성: 자식 프로세스는 생성될 때 부모 프로세스의 환경 변수 설정을 그대로 물려받는다. 프로그램이 다른 프로그램을 실행할 때, 이 상속 기능을 이용해 실행될 프로그램의 환경을 제어할 수 있다.


유닉스 계열 셸에서는 `export` 명령어 없이 변수를 할당할 수도 있는데, 이렇게 생성된 변수는 해당 셸 내부에서만 사용 가능하며 자식 프로세스로 전달되지 않아 진정한 의미의 환경 변수와는 구별된다.

환경 변수는 설정 방식에 따라 현재 세션 동안만 유지되거나, 시스템 전체에 영구적으로 적용될 수 있다. 예를 들어, 윈도우에서는 제어판을 통해 시스템 또는 사용자 수준에서 환경 변수를 영구적으로 설정할 수 있으며, 이렇게 설정된 값은 재부팅 후에도 유지된다.[9] 명령줄에서 직접 설정한 변수는 해당 세션이 종료되면 일반적으로 사라진다.

3. 1. Windows

도스와 윈도우 환경에서는 명령 프롬프트에서 '''`SET`''' 명령어를 아무런 인수 없이 입력하면 현재 설정된 모든 환경 변수와 그 값을 확인할 수 있다.[1][2] 윈도우 NT 이후 버전에서는 `SET` 명령어 뒤에 특정 문자열(접두사)을 입력하면, 해당 문자열로 시작하는 모든 환경 변수 목록을 볼 수도 있다.[3]

환경 변수를 새로 설정하거나 기존 변수의 값을 변경하려면 다음 형식을 사용하며, 값 없이 변수 이름만 지정하면 해당 변수가 삭제된다.[1][4]

```batch

SET 변수=값

SET 변수=

```

도스, OS/2, 그리고 윈도우의 명령 줄 인터프리터인 `COMMAND.COM`이나 `CMD.EXE`에서는 환경 변수의 값을 사용하기 위해 변수 이름 앞뒤에 `%` 기호를 붙인다. 예를 들어, 사용자의 홈 디렉토리가 있는 드라이브 문자를 담고 있는 `HOMEDRIVE` 변수와 해당 드라이브 내의 전체 경로를 담고 있는 `HOMEPATH` 변수의 값을 함께 확인하려면 다음과 같이 입력한다. 이러한 환경 변수 이름은 대소문자를 구분하지 않는다.[5]

```batch

ECHO %HOMEDRIVE%%HOMEPATH%

```

PowerShell에서는 환경 변수 값을 참조할 때 `$env:` 접두사를 사용하며, 마찬가지로 대소문자를 구분하지 않는다.[6]

```powershell

echo $env:homedrive$env:homepath

Write-Output $env:homedrive$env:homepath

"$env:homedrive$env:homepath"

```

PowerShell에서 모든 환경 변수 목록을 보려면 다음 명령어를 사용한다.[6]

```powershell

get-childitem env:

```

PowerShell에서 환경 변수를 설정하는 구문은 유닉스 계열과 유사하다.[7]

```powershell

$env:VARIABLE = "VALUE"

```

`CMD.EXE` 환경에서는 `SETLOCAL` 명령어를 사용하여 환경 변수 변경 범위를 지역적으로 제한할 수 있다. `SETLOCAL` 이후에 변경된 내용은 `ENDLOCAL` 명령어를 만나면 원래대로 복원되어, 전역 환경에 영향을 주지 않는다.[4] 각 명령어의 자세한 사용법은 `/?` 스위치나 `help` 명령어를 통해 확인할 수 있다.[4]

```batch

SET /?

HELP SET

SETLOCAL /?

HELP SETLOCAL

```

다음 표는 영어 버전의 윈도우에서 `CMD.EXE`를 통해 확인할 수 있는 주요 환경 변수들의 일반적인 기본값을 보여준다. (이 변수 중 일부는 `COMMAND.COM`에서도 정의되지만, `COMMAND.COM`에서는 변수 이름이 항상 대문자이고, 일부 경로가 8.3 파일 이름 형식으로 표시되는 등 차이가 있다.)[8]

변수로케일 관련 여부Windows XP (CMD)Windows Vista 이상 (CMD)
%ALLUSERSPROFILE%C:\Documents and Settings\All UsersC:\ProgramData
%APPDATA%C:\Documents and Settings\{username}\Application DataC:\Users\{username}\AppData\Roaming
%CommonProgramFiles%C:\Program Files\Common FilesC:\Program Files\Common Files
%CommonProgramFiles(x86)%C:\Program Files (x86)\Common Files (64비트 버전에서만)C:\Program Files (x86)\Common Files (64비트 버전에서만)
%CommonProgramW6432%%CommonProgramW6432% (지원되지 않으며, 값으로 대체되지 않음)C:\Program Files\Common Files (64비트 버전에서만)
%COMPUTERNAME%아니요{computername}{computername}
%ComSpec%아니요C:\Windows\System32\cmd.exeC:\Windows\System32\cmd.exe
%HOMEDRIVE%아니요C:C:
%HOMEPATH%\Documents and Settings\{username}\Users\{username}
%LOCALAPPDATA%%LOCALAPPDATA% (지원되지 않으며, 값으로 대체되지 않음)C:\Users\{username}\AppData\Local
%LOGONSERVER%아니요\\{domain_logon_server}\\{domain_logon_server}
%PATH%C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;{plus program paths}C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;{plus program paths}
%PATHEXT%아니요.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.WSF;.WSH.com;.exe;.bat;.cmd;.vbs;.vbe;.js;.jse;.wsf;.wsh;.msc
%ProgramData%%ProgramData% (지원되지 않으며, 값으로 대체되지 않음)%SystemDrive%\ProgramData
%ProgramFiles%%SystemDrive%\Program Files%SystemDrive%\Program Files
%ProgramFiles(x86)%%SystemDrive%\Program Files (x86) (64비트 버전에서만)%SystemDrive%\Program Files (x86) (64비트 버전에서만)
%ProgramW6432%%ProgramW6432% (지원되지 않으며, 값으로 대체되지 않음)%SystemDrive%\Program Files (64비트 버전에서만)
%PROMPT%아니요현재 명령 프롬프트 형식의 코드, 일반적으로 $P$G현재 명령 프롬프트 형식의 코드, 일반적으로 $P$G
%PSModulePath%%PSModulePath% (지원되지 않으며, 값으로 대체되지 않음)%SystemRoot%\system32\WindowsPowerShell\v1.0\Modules\
%PUBLIC%%PUBLIC% (지원되지 않으며, 값으로 대체되지 않음)%SystemDrive%\Users\Public
%SystemDrive%아니요C:C:
%SystemRoot%아니요Windows 디렉터리, 일반적으로 C:\Windows, 이전에는 C:\WINNT%SystemDrive%\Windows
%TEMP%%TMP%%SystemDrive%\Documents and Settings\{username}\Local Settings\Temp%SystemRoot%\TEMP (시스템 환경 변수 %TMP%%TEMP%의 경우), %USERPROFILE%\AppData\Local\Temp (사용자 환경 변수 %TMP%%TEMP%의 경우)
%USERDOMAIN%아니요{userdomain}{userdomain}
%USERNAME%아니요{username}{username}
%USERPROFILE%%SystemDrive%\Documents and Settings\{username}%SystemDrive%\Users\{username}
%windir%아니요%SystemDrive%\WINDOWS%SystemDrive%\Windows



위 목록에는 사용자의 '내 문서' 폴더 위치를 가리키는 표준 환경 변수가 없다는 점에 유의해야 한다.[8]

명령 프롬프트나 배치 파일에서 `SET` 명령어를 사용하여 설정한 환경 변수는 해당 명령 프롬프트 세션과 그 세션에서 실행된 자식 프로세스에만 영향을 미치는 일시적인 설정이다.[9] 과거 MS-DOS 시절에는 AUTOEXEC.BAT 파일에 `SET` 명령어를 기술하여 부팅 시 환경 변수를 설정하기도 했다.[9]

현대 윈도우에서는 환경 변수를 영구적으로 설정하려면 제어판의 시스템 속성 메뉴를 이용해야 한다. 제어판에서는 시스템 환경 변수사용자 환경 변수 두 가지 유형으로 나누어 관리한다.[9]


  • 시스템 환경 변수: 시스템 전체 사용자에게 적용되며, 변경하려면 관리자 권한이 필요하다.
  • 사용자 환경 변수: 현재 로그인한 사용자에게만 적용된다.


제어판을 통해 설정된 환경 변수는 이후에 시작되는 모든 프로세스에 적용되며, 시스템을 재부팅해도 유지된다.[9]

3. 2. macOS 및 Linux

macOS나 리눅스와 같은 유닉스 계열 운영체제에서는 여러 명령어를 통해 환경 변수를 확인하고 설정할 수 있다.

=== 환경 변수 확인 ===

`env`, `set`, `printenv` 명령어는 아무런 옵션 없이 실행하면 현재 설정된 모든 환경 변수와 그 값을 보여준다. `printenv` 명령어는 특정 변수 이름과 함께 사용하면 해당 변수의 값만 출력한다.



# 모든 환경 변수 확인

env

set

printenv

# 특정 환경 변수(예: PATH) 확인

printenv PATH



=== 환경 변수 설정 ===

환경 변수를 설정하는 방법은 사용하는 에 따라 다르다.
`export` 명령어를 사용한다. 등호(=) 주변에는 공백이 없어야 한다.



VARIABLE='value' # 셸 변수로 설정 (자식 프로세스로 전달되지 않음)

export VARIABLE # 환경 변수로 내보내기

# 또는 한 번에 설정 및 내보내기

export VARIABLE='value'



`export` 키워드 없이 할당된 변수는 `set` 명령으로는 보이지만, 해당 셸 프로세스에만 로컬로 존재하며 자식 프로세스로 상속되지 않는다. 즉, '진정한' 환경 변수가 아니다. `printenv` 명령은 이렇게 설정된 변수를 표시하지 않는다.

  • '''C 셸(csh), tcsh 등:'''

`setenv` 명령어를 사용한다.



setenv VARIABLE 'value'



=== 환경 변수의 특징 ===

환경 변수는 몇 가지 중요한 특징을 가진다.

  • 로컬성: 환경 변수는 설정된 프로세스 내에서만 유효하다. 예를 들어, 두 개의 셸 창을 열고 한쪽에서 환경 변수를 변경해도 다른 쪽 셸에는 영향을 주지 않는다.
  • 상속성: 자식 프로세스는 생성될 때 부모 프로세스의 환경 변수 설정을 그대로 물려받는다. 일반적으로 프로그램이 다른 프로그램을 실행할 때는 먼저 fork를 통해 자식 프로세스를 만들고, 필요에 따라 환경 변수를 조정한 뒤, exec를 호출하여 새로운 프로그램으로 대체한다. 이를 통해 호출하는 프로그램이 호출될 프로그램의 실행 환경을 제어할 수 있다.


=== 임시 환경 변수 설정 ===

특정 명령을 실행할 때만 임시로 환경 변수를 설정하여 전달할 수도 있다. 이 방식은 현재 셸 환경에는 영향을 주지 않는다.



VARIABLE='value' program_name [arguments]



=== 환경 변수 해제 ===

설정된 환경 변수를 해제(삭제)하려면 `unset` 명령어를 사용한다. 이 명령어는 본 셸 계열과 C 셸 계열 모두에서 사용 가능한 셸 내장 명령어이다.



# VARIABLE 환경 변수 해제

unset VARIABLE



단, 읽기 전용(read-only)으로 설정된 셸 변수는 `unset`으로 해제할 수 없으며, 시도할 경우 오류가 발생한다.

4. 환경 변수의 종류

환경 변수는 프로세스의 실행 환경 외부에서 설정되어, 해당 프로세스의 동작 방식에 영향을 미치는 동적인 값이다. 환경 변수는 일반적으로 '변수명=값' 형식으로 이름과 값을 가지며, 변수 이름은 보통 영문자, 숫자, _로 구성되고, 값은 특별한 데이터 형식 없이 단순 문자열로 취급되는 경우가 많다. 하지만 특정 프로그램은 환경 변수의 값을 해석하여 특정 구조나 의미를 부여하기도 한다.[11]

각 프로세스는 자신만의 환경 변수 집합, 즉 '환경'을 지닌다. 프로세스는 실행 중에 자신의 환경을 참조하여 정보를 얻거나 동작 방식을 변경할 수 있으며, 환경 변수를 새로 만들거나 기존 변수의 값을 변경하고 삭제하는 것도 가능하다. 환경은 부모 프로세스에서 자식 프로세스로 복제되어 상속된다는 특징이 있다. 기본적으로 자식 프로세스는 부모 프로세스와 동일한 환경을 물려받으며, 자식 프로세스에서 환경을 변경하더라도 부모 프로세스의 환경에는 영향을 미치지 않는다.

환경 변수는 크게 정의 주체와 영향 범위에 따라 나눌 수 있다.


  • 정의 주체 기준:
  • 시스템 정의 변수: 운영체제나 시스템 소프트웨어가 미리 정의하여 사용하는 변수로, 시스템 전반의 설정이나 중요한 경로 정보 등을 담고 있다.
  • 사용자 정의 변수: 사용자가 필요에 따라 임의로 생성하고 설정하는 변수로, 특정 프로그램의 동작을 제어하거나 셸 스크립트 등에서 임시 값을 저장하는 데 사용될 수 있다.

  • 영향 범위 기준:
  • 시스템 환경 변수: 시스템 전체 또는 모든 사용자에게 영향을 미치는 변수이다. 주로 시스템 관리자가 설정하며 운영체제 운영에 필수적인 정보를 포함하는 경우가 많다. 윈도우에서는 윈도우 레지스트리에 저장되어 영구적으로 유지되기도 한다.[1]
  • 사용자 환경 변수: 특정 사용자 계정에만 영향을 미치는 변수이다. 해당 사용자의 개인 설정이나 작업 환경과 관련된 정보를 주로 담는다. 윈도우에서는 사용자별 레지스트리나 프로필에 저장되는 경우가 많다.


이러한 환경 변수는 유닉스, 유닉스 계열 시스템(리눅스, macOS 등), MS-DOS, 윈도우 등 다양한 운영체제에서 중요한 역할을 수행한다. 구체적인 환경 변수의 종류와 사용법은 운영체제별로 차이가 있다.

4. 1. 운영체제별 주요 환경 변수

환경 변수는 운영체제나 과 같은 프로세스 외부에서 설정되어 해당 프로세스의 동작 방식에 영향을 미치는 동적인 값이다. 주요 운영체제별로 자주 사용되는 환경 변수는 다음과 같다.

=== 유닉스 계열 (리눅스, macOS 등) ===

유닉스 계열 운영체제에서는 다양한 환경 변수가 사용된다. 셸 스크립트 등에서 자주 활용되며, 사용자의 작업 환경을 설정하는 데 중요한 역할을 한다. 주요 환경 변수는 다음과 같다.

  • PATH: 실행 파일을 찾는 데 사용되는 디렉터리 경로 목록이다. 사용자가 전체 경로 없이 명령어를 입력하면, 셸은 이 PATH에 지정된 디렉터리들을 순서대로 검색하여 해당 명령어를 실행한다. 각 경로는 콜론(:)으로 구분된다. MS-DOS, OS/2, 윈도우의 %PATH% 변수와 유사하다.
  • HOME: 사용자의 홈 디렉터리 경로를 나타낸다. cd 명령어처럼 인자 없이 사용될 때 기본 이동 경로가 되며, 많은 프로그램이 사용자별 설정 파일을 저장하는 기본 위치로 사용한다. C 함수 getpwuid, getuid 등으로도 홈 디렉터리를 찾을 수 있지만, 편의상 HOME 변수가 널리 쓰인다.[11]
  • TERM: 사용 중인 컴퓨터 터미널 또는 터미널 에뮬레이터의 종류를 지정한다 (예: vt100, dumb). 터미널에 맞는 화면 제어 코드를 사용하기 위해 참조된다.
  • PS1: 본 셸 및 그 파생 셸(bash, ksh 등)에서 명령어 프롬프트의 형식을 지정한다.
  • MAIL: 사용자의 메일이 저장된 경로를 지정한다. (예: /var/mail/$USER)
  • TEMP 또는 TMPDIR: 임시 파일을 저장할 디렉터리를 지정한다. 많은 프로그램이 작업 중 임시 데이터를 저장하기 위해 이 변수를 참조한다.
  • PWD: 현재 작업 디렉터리의 경로를 나타낸다. pwd 명령어와 동일한 값을 가진다.
  • DISPLAY: X11 프로그램이 그래픽 출력을 표시할 기본 디스플레이 서버를 지정한다. (예: :0.0)
  • LD_LIBRARY_PATH: 프로그램 실행 시 동적 링커가 공유 라이브러리를 찾는 경로 목록이다. 시스템 기본 경로보다 먼저 검색된다. (일부 오래된 유닉스 시스템에서는 LIBPATH 또는 SHLIB_PATH를 사용하기도 한다.)
  • LANG, LC_ALL, LC_*: 로케일 설정을 지정한다. LANG은 기본 로케일을 설정하며 (예: ko_KR.UTF-8), LC_CTYPE(문자 분류), LC_COLLATE(정렬 순서), LC_TIME(날짜/시간 형식) 등 개별 LC_* 변수로 특정 부분의 로케일을 다르게 설정할 수 있다. LC_ALL은 모든 로케일 설정을 강제로 통일시킨다.
  • TZ: 시간대 정보를 지정한다. (예: Asia/Seoul 또는 KST-9)
  • BROWSER: 사용자가 선호하는 웹 브라우저 목록을 콜론으로 구분하여 지정한다. URL을 열어야 하는 프로그램이 이 변수를 참조하여 순서대로 브라우저 실행을 시도한다.
  • EDITOR / VISUAL: 기본 텍스트 편집기를 지정한다. VISUAL은 주로 전체 화면 편집기(예: vi, nano), EDITOR는 라인 편집기(예: ed)를 지정하는 데 사용되었으나, 현재는 큰 구분 없이 사용되기도 한다.
  • SHELL: 사용자의 기본 로그인 셸 경로를 나타낸다. (예: /bin/bash)
  • USER 또는 LOGNAME: 현재 로그인한 사용자 이름을 나타낸다.
  • PAGER: man 페이지나 긴 텍스트 파일을 화면 단위로 보여주는 프로그램(페이저)을 지정한다. (예: less, more)


유닉스 셸에서는 export 명령어를 사용하여 환경 변수를 설정하고 자식 프로세스에게 상속시킬 수 있다. export 없이 설정된 변수는 해당 셸 내부에서만 유효한 '셸 변수'가 된다. unset 명령어로 환경 변수나 셸 변수를 해제할 수 있다.

=== 마이크로소프트 윈도우 ===

마이크로소프트 윈도우 환경에서는 MS-DOS에서 유래한 환경 변수와 윈도우 NT 계열에서 추가된 환경 변수들이 함께 사용된다. 명령 프롬프트(cmd.exe)나 파워셸에서 %변수명% (cmd) 또는 $env:변수명 (PowerShell) 형태로 값을 참조할 수 있다. 환경 변수 이름은 대소문자를 구분하지 않는다. 주요 환경 변수는 다음과 같다.

  • PATH: 실행 파일을 찾는 데 사용되는 디렉터리 경로 목록이다. 각 경로는 세미콜론(;)으로 구분된다. 유닉스 계열의 PATH와 유사하다.
  • USERPROFILE: 현재 로그인한 사용자의 사용자 프로필 디렉터리 경로를 나타낸다. (예: C:\Users\{사용자 이름}) 유닉스 계열의 HOME과 유사하다.
  • APPDATA: 사용자의 애플리케이션 데이터(로밍) 디렉터리 경로를 나타낸다. 여러 컴퓨터에서 동기화될 수 있는 설정 파일 등을 저장하는 데 사용된다. (예: C:\Users\{사용자 이름}\AppData\Roaming)
  • LOCALAPPDATA: 사용자의 로컬 애플리케이션 데이터 디렉터리 경로를 나타낸다. 동기화되지 않는 캐시 파일이나 임시 설정 등을 저장하는 데 사용된다. (예: C:\Users\{사용자 이름}\AppData\Local)
  • PROGRAMDATA: 모든 사용자가 공유하는 애플리케이션 데이터 디렉터리 경로를 나타낸다. (Windows Vista 이상, 이전 버전의 ALLUSERSPROFILE과 유사) (예: C:\ProgramData)
  • TEMP 또는 TMP: 임시 파일을 저장할 디렉터리 경로를 나타낸다. 사용자별 임시 폴더(예: %LOCALAPPDATA%\Temp)나 시스템 임시 폴더(예: %SystemRoot%\TEMP)를 가리킬 수 있다.
  • SystemRoot: 윈도우 시스템 파일이 설치된 디렉터리 경로를 나타낸다. (예: C:\Windows) WINDIR 변수와 동일한 값을 가지는 경우가 많다.
  • SystemDrive: 윈도우 시스템 파일이 설치된 드라이브 문자를 나타낸다. (예: C:)
  • ProgramFiles: 프로그램 설치 기본 디렉터리 경로를 나타낸다. (예: C:\Program Files) 64비트 윈도우에서는 32비트 프로그램용 ProgramFiles(x86) 변수도 존재한다.
  • CommonProgramFiles: 여러 프로그램이 공유하는 파일들이 저장되는 디렉터리 경로를 나타낸다. (예: C:\Program Files\Common Files) 64비트 윈도우에서는 CommonProgramFiles(x86) 변수도 존재한다.
  • COMSPEC: 기본 명령 줄 인터프리터의 전체 경로를 나타낸다. (예: C:\Windows\System32\cmd.exe)
  • PATHEXT: PATH에서 실행 파일을 찾을 때, 확장자 없이 파일 이름만 입력해도 실행될 수 있도록 인식하는 파일 확장자 목록이다. 세미콜론으로 구분된다. (예: .COM;.EXE;.BAT;.CMD)
  • COMPUTERNAME: 컴퓨터의 호스트 이름을 나타낸다.
  • USERNAME: 현재 로그인한 사용자 이름을 나타낸다.
  • USERDOMAIN: 현재 사용자가 속한 도메인 또는 작업 그룹 이름을 나타낸다.
  • HOMEDRIVE: 사용자의 홈 디렉터리가 위치한 드라이브 문자를 나타낸다. (예: C:)
  • HOMEPATH: 홈 드라이브 내에서 사용자의 홈 디렉터리 경로를 나타낸다. (예: \Users\{사용자 이름}) %HOMEDRIVE%%HOMEPATH%%USERPROFILE%과 같은 경로를 나타낸다.
  • OS: 운영체제 종류를 나타낸다. 윈도우 NT 계열에서는 일반적으로 Windows_NT 값을 가진다.
  • PROCESSOR_ARCHITECTURE, NUMBER_OF_PROCESSORS 등: CPU 관련 정보를 담고 있다.
  • OneDrive: OneDrive 동기화 폴더의 경로를 나타낸다. (설치된 경우)


윈도우에서는 제어판의 시스템 속성 메뉴나 setx 명령어를 통해 영구적으로 환경 변수를 설정할 수 있다. 제어판에서는 시스템 전체에 적용되는 '시스템 변수'와 현재 사용자에게만 적용되는 '사용자 변수'를 구분하여 관리할 수 있다. 명령 프롬프트에서 set 명령어로 설정한 변수는 해당 명령 프롬프트 창과 그 창에서 실행된 자식 프로세스에서만 유효하다.

아래 표는 윈도우 버전별 주요 환경 변수의 일반적인 기본값을 보여준다. (실제 값은 시스템 설정이나 언어에 따라 다를 수 있다.)

변수Windows XP (CMD)Windows Vista 이상 (CMD)
%ALLUSERSPROFILE%C:\Documents and Settings\All UsersC:\ProgramData
%APPDATA%C:\Documents and Settings\{username}\Application DataC:\Users\{username}\AppData\Roaming
%CommonProgramFiles%C:\Program Files\Common FilesC:\Program Files\Common Files
%CommonProgramFiles(x86)%C:\Program Files (x86)\Common Files (64비트 버전에서만)C:\Program Files (x86)\Common Files (64비트 버전에서만)
%COMPUTERNAME%{computername}{computername}
%ComSpec%C:\Windows\System32\cmd.exeC:\Windows\System32\cmd.exe
%HOMEDRIVE%C:C:
%HOMEPATH%\Documents and Settings\{username}\Users\{username}
%LOCALAPPDATA%(지원되지 않음)C:\Users\{username}\AppData\Local
%LOGONSERVER%\\{domain_logon_server}\\{domain_logon_server}
%PATH%C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;...C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;...
%PATHEXT%.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.WSF;.WSH.com;.exe;.bat;.cmd;.vbs;.vbe;.js;.jse;.wsf;.wsh;.msc
%ProgramData%(지원되지 않음)%SystemDrive%\ProgramData
%ProgramFiles%%SystemDrive%\Program Files%SystemDrive%\Program Files
%ProgramFiles(x86)%%SystemDrive%\Program Files (x86) (64비트 버전에서만)%SystemDrive%\Program Files (x86) (64비트 버전에서만)
%PROMPT%$P$G$P$G
%PUBLIC%(지원되지 않음)%SystemDrive%\Users\Public
%SystemDrive%C:C:
%SystemRoot%C:\Windows (또는 C:\WINNT)%SystemDrive%\Windows
%TEMP%%TMP%%SystemDrive%\Documents and Settings\{username}\Local Settings\Temp%USERPROFILE%\AppData\Local\Temp (사용자 변수), %SystemRoot%\TEMP (시스템 변수)
%USERDOMAIN%{userdomain}{userdomain}
%USERNAME%{username}{username}
%USERPROFILE%%SystemDrive%\Documents and Settings\{username}%SystemDrive%\Users\{username}
%windir%%SystemDrive%\WINDOWS%SystemDrive%\Windows



=== MS-DOS ===

MS-DOS 환경에서는 환경 변수의 사용이 제한적이었으나, 시스템 설정과 프로그램 동작에 영향을 미치는 중요한 변수들이 있었다. 배치 파일 등에서 %변수명% 형식으로 값을 참조했다. 이름은 일반적으로 대문자로 사용되었다.


  • PATH: 명령어를 검색할 디렉터리 경로 목록을 세미콜론으로 구분하여 지정한다.
  • COMSPEC: 기본 명령 인터프리터(COMMAND.COM)의 전체 경로를 지정한다. CONFIG.SYS 파일의 SHELL= 설정이 반영된다.
  • PROMPT: 명령어 프롬프트의 형식을 지정한다. (예: $P$G는 현재 드라이브 및 경로와 > 기호를 표시)
  • TEMP 또는 TMP: 임시 파일을 저장할 디렉터리를 지정한다.
  • APPEND: 데이터 파일을 검색할 디렉터리 목록을 지정한다. APPEND /E 명령으로 설정된다.
  • CONFIG: MS-DOS 6.0 이상에서 CONFIG.SYS의 다중 부팅 설정 시 선택된 메뉴 항목의 이름을 저장한다.
  • DIRCMD: MS-DOS 5.0 이상에서 DIR 명령어의 기본 옵션을 지정한다.
  • COPYCMD: MS-DOS 6.2 이상에서 COPY, MOVE, XCOPY 명령어의 기본 옵션(주로 /Y)을 지정한다.


DR-DOS와 같은 호환 DOS에서는 더 많은 환경 변수를 지원하기도 했다. 예를 들어, OS 변수는 운영체제 종류("DRDOS", "NWDOS" 등)를, VER 변수는 버전을 나타내어 배치 파일 등에서 호환성을 확인하는 데 사용되었다.

=== OS/2 ===

OS/2에서는 MS-DOS/윈도우와 유사한 환경 변수 체계를 사용했지만, DLL 검색 경로를 제어하는 고유한 변수들이 있었다.

  • BEGINLIBPATH: 시스템 기본 DLL 검색 경로(LIBPATH)보다 ''먼저'' 검색할 디렉터리 목록을 세미콜론으로 구분하여 지정한다.
  • ENDLIBPATH: 시스템 기본 DLL 검색 경로(LIBPATH)보다 ''나중에'' 검색할 디렉터리 목록을 지정한다.

4. 2. 시스템 환경 변수

운영체제가 전체 시스템에 걸쳐 사용하는 환경 변수를 시스템 환경 변수라고 한다. 이는 특정 사용자나 프로세스에 국한되지 않고 시스템 전반의 동작에 영향을 미친다. 유닉스유닉스 계열 시스템에서는 시스템 시작 시 init 시작 스크립트에 의해 초기화되어 모든 프로세스에 상속되는 경우가 일반적이다. 마이크로소프트 윈도우에서는 시스템 환경 변수의 기본값이 윈도우 레지스트리에 저장되거나, 구형 시스템의 경우 `AUTOEXEC.BAT` 파일에 설정된다.[1]

시스템 환경 변수는 중요한 운영 체제 리소스의 위치를 나타내는 등 시스템 운영에 필수적인 정보를 담고 있으며, 일반적으로 사용자에 따라 달라지지 않는다.[1] 주요 윈도우 시스템 환경 변수는 다음과 같다.

변수명설명
`%APPDATA%`현재 로그인한 사용자의 Application Data 디렉터리 경로로, 응용 프로그램 설정 등이 저장된다.
`%LOCALAPPDATA%`사용자별 로컬 응용 프로그램 데이터 경로이다. 로밍되지 않는 임시 파일, 캐시, 사용자 설정 등을 저장하며, 데스크톱 테마, Windows 오류 보고, 웹 브라우저 캐시 및 프로필 등이 여기에 해당한다.
`%ComSpec%`
`%COMSPEC%`
명령 프롬프트 실행 파일(`cmd.exe` 또는 `COMMAND.COM`)의 전체 경로이다.
`%OS%`운영 체제 계열을 나타내는 이름이다. Windows NT 계열에서는 항상 "Windows_NT" 값을 가진다. 배치 파일 등에서 운영 체제 종류를 구분하는 데 사용될 수 있다.
`%PATH%`실행 파일을 찾을 디렉터리 경로 목록이다. 각 경로는 세미콜론으로 구분된다. 명령 프롬프트나 에서 명령어 입력 시, 이 경로들을 순차적으로 탐색하여 해당 명령어를 실행한다. 유닉스의 `$PATH` 변수와 유사하다.
`%PROCESSOR_ARCHITECTURE%`
`%PROCESSOR_ARCHITEW6432%`
`%PROCESSOR_IDENTIFIER%`
`%PROCESSOR_LEVEL%`
`%PROCESSOR_REVISION%`
시스템에 설치된 CPU의 아키텍처, 식별자, 수준, 리비전 등 상세 정보를 포함한다.
`%PUBLIC%`모든 사용자가 공유하는 Public 사용자 프로필 디렉터리 경로 (예: "C:\Users\Public")이다. 윈도우 비스타 이후 도입되었다.
`%ProgramFiles%`
`%ProgramFiles(x86)%`
`%ProgramW6432%`
프로그램 설치 기본 경로인 Program Files 디렉터리이다. 64비트 윈도우에서는 32비트/64비트 프로세스에 따라 다른 경로를 가리킬 수 있으며 (`%ProgramFiles(x86)%`는 32비트 프로그램용), 이는 WoW64 리디렉션 때문이다.[2]
`%CommonProgramFiles%`
`%CommonProgramFiles(x86)%`
`%CommonProgramW6432%`
여러 프로그램이 공유하는 파일들이 저장되는 Common Files 디렉터리 경로이다. 64비트 윈도우에서는 `%ProgramFiles%`와 유사하게 환경에 따라 경로가 달라질 수 있다.
`%OneDrive%`OneDrive 동기화 폴더의 경로이다 (설치된 경우).
`%SystemDrive%`윈도우 시스템 디렉터리가 위치한 드라이브 문자 (예: "C:")이다.
`%SystemRoot%`윈도우 시스템 디렉터리의 전체 경로 (예: "C:\WINDOWS")이다. 운영 체제 버전에 따라 기본 설치 시 경로가 다를 수 있다.
`%windir%`윈도우 디렉터리 경로이다. Windows NT 계열에서는 `%SystemRoot%`와 동일하다.



윈도우에서 시스템 환경 변수는 제어판의 시스템 속성 메뉴를 통해 설정하거나 변경할 수 있다. 제어판에서 시스템 환경 변수를 변경하려면 관리자 권한이 필요하며, 이렇게 변경된 내용은 시스템 재부팅 후에도 유지되고 이후 시작되는 모든 프로세스에 적용된다.

반면, 명령 프롬프트에서 `set` 명령어를 사용하여 변경된 환경 변수는 해당 명령 프롬프트 세션과 그 세션에서 실행된 자식 프로세스에만 영향을 미치며, 창을 닫으면 변경 사항이 사라진다. 따라서 영구적인 변경을 원한다면 제어판을 이용하는 것이 일반적이다.
주의사항:유닉스 시스템에서는 setuid 프로그램 실행 시 보안상의 이유로 특정 환경 변수(예: `$LD_LIBRARY_PATH`, `$LD_PRELOAD`)가 동적 링커에 의해 무시되거나 초기화될 수 있다. 이는 악의적인 사용자가 높은 권한을 가진 프로그램의 실행 흐름을 조작하여 시스템 보안을 침해하는 것을 방지하기 위한 조치이다. libc와 같은 표준 라이브러리는 이러한 보안 기능을 내장하여 시스템의 안정성을 높인다. 따라서 중요한 시스템 작업을 수행할 때는 환경 변수가 미칠 수 있는 영향을 신중하게 고려해야 한다.

4. 3. 사용자 환경 변수

사용자 환경 변수는 시스템 내의 특정 사용자 프로필과 관련된 리소스 및 설정을 저장하는 데 사용된다. 일반적으로 운영 체제 실행에 필수적인 시스템 리소스나 위치를 직접 참조하지는 않는다. 주요 사용자 환경 변수는 다음과 같다.

;%APPDATA%

: 로그인한 사용자의 ''Application Data'' 디렉터리의 전체 경로를 포함한다.

;%LOCALAPPDATA%

: 애플리케이션의 임시 파일을 저장하는 데 사용된다. 예를 들어 데스크톱 테마, Windows 오류 보고, 웹 브라우저의 캐시 및 프로필 등이 여기에 해당한다.

;%ALLUSERSPROFILE% (Windows Vista부터 %PROGRAMDATA%)

: ''모든 사용자'' 프로필 디렉터리의 전체 경로로 확장된다. 이 프로필에는 시스템의 모든 계정이 공유하는 리소스와 설정이 포함된다. 예를 들어, 이 디렉토리의 ''시작 메뉴''나 ''바탕화면'' 폴더에 바로 가기를 만들면 모든 사용자의 시작 메뉴나 바탕화면에 해당 바로 가기가 표시된다.

;%USERDOMAIN%

: 현재 사용자가 속한 작업 그룹 또는 윈도우 도메인의 이름을 나타낸다. 관련 변수인 %LOGONSERVER%는 현재 사용자의 로그인 정보를 인증한 서버의 호스트 이름을 저장한다. 일반 가정용 PC나 작업 그룹에 속한 PC의 경우, 인증 서버는 보통 해당 PC 자체이다. 윈도우 도메인 환경에서는 도메인 컨트롤러가 인증 서버 역할을 한다.

;%USERPROFILE%

: 윈도우 NT 계열 운영 체제에서 사용되는 변수로, 현재 사용자의 프로필 디렉터리 위치를 나타낸다. 이 디렉터리에는 해당 사용자의 윈도우 레지스트리 하이브(NTUSER 파일)가 저장된다. 현재 활성화된 사용자 로그인을 확인하려면 %USERNAME% 변수를 사용할 수도 있다.

;%OneDrive%

: 마이크로소프트 원드라이브 디렉터리가 설치되고 설정된 경우 해당 위치의 경로를 나타낸다. 일반적으로 "C:\Users\{사용자 이름}\OneDrive\"와 같은 형태이다.

=== 설정 방법 ===

윈도우에서는 제어판을 통해 사용자 환경 변수를 설정할 수 있다. 제어판의 '시스템 속성' > '고급' 탭 > '환경 변수' 버튼을 클릭하면 시스템 전체에 적용되는 시스템 변수와 현재 로그인한 사용자에게만 적용되는 사용자 변수를 각각 관리할 수 있다.

제어판에서 설정한 환경 변수는 윈도우 레지스트리에 저장되어 재부팅 후에도 유지되며, 설정 변경 이후 새로 시작되는 프로세스에 적용된다. 시스템 환경 변수를 변경하려면 관리자 권한이 필요하지만, 사용자 환경 변수는 해당 사용자 계정으로 로그인하여 변경할 수 있다.

명령 프롬프트에서 set 명령어를 사용하여 환경 변수를 설정할 수도 있지만, 이렇게 설정된 변수는 해당 명령 프롬프트 창과 그 창에서 실행된 자식 프로세스에서만 유효하며, 창을 닫으면 사라진다. 영구적으로 사용자 환경 변수를 변경하려면 제어판을 이용하는 것이 일반적이다.

5. 환경 변수 활용 사례

환경 변수는 운영 체제 내에서 실행되는 프로세스들이 사용하는 설정 값들의 모음이다. 각 프로세스는 자신만의 환경 변수 설정을 가지며, 기본적으로는 자신을 실행시킨 부모 프로세스의 환경 변수 설정을 물려받는다. 이렇게 상속된 환경 변수는 프로그램이 실행되는 데 필요한 다양한 정보를 제공하는 역할을 한다.

예를 들어, 셸 스크립트배치 파일은 환경 변수를 통해 자식 프로세스에게 필요한 정보를 전달하거나, 스크립트 내에서 임시 값을 저장하는 데 활용할 수 있다. 실행 중인 프로그램 역시 환경 변수 값을 읽어 자신의 동작 방식을 결정하거나 필요한 설정을 얻는 데 사용한다. 이처럼 환경 변수는 프로그램의 실행 환경을 구성하고 프로세스 간 정보를 주고받는 중요한 수단이며, 개발 환경 설정, 소프트웨어 실행, 시스템 관리 등 다양한 분야에서 활용된다.

5. 1. 개발 환경 설정

개발 환경에서 환경 변수는 다양한 도구와 라이브러리의 경로를 설정하고 관리하는 데 중요한 역할을 한다. 특히 여러 개발 도구나 라이브러리를 설치하고 사용할 때, 시스템이 해당 파일들을 정확히 찾을 수 있도록 경로를 지정해주어야 한다.

대표적인 예로 `PATH` 환경 변수가 있다. `PATH`는 운영 체제가 명령어나 실행 파일을 찾는 데 사용하는 디렉터리 경로들의 목록이다. 예를 들어, JDK나 특정 SDK를 설치한 후, 해당 도구의 실행 파일이 있는 디렉토리를 `PATH`에 추가하면, 어떤 위치에서든 터미널이나 명령 프롬프트에서 해당 도구의 이름을 입력하는 것만으로 쉽게 실행할 수 있다. 사용자가 전체 경로를 입력하지 않아도 시스템이 `PATH` 목록을 확인하여 해당 명령어를 찾아 실행하기 때문이다.

또한, 프로그램 실행에 필요한 DLL 파일들의 검색 경로를 지정하는 환경 변수도 있다. 예를 들어, `%BEGINLIBPATH%`는 시스템이 기본적으로 참조하는 라이브러리 경로(`%LIBPATH%`)보다 먼저 검색할 디렉터리 목록을 지정한다. 반대로 `%ENDLIBPATH%`는 기본 라이브러리 경로(`%LIBPATH%`)를 검색한 후에 참조할 디렉터리 목록을 지정한다. 이를 통해 개발자는 특정 라이브러리 파일의 로딩 순서를 제어하거나, 필요한 라이브러리를 시스템에 등록된 경로 외의 다른 위치에서 불러올 수 있다.

한편, 개발 과정에서는 API 키나 데이터베이스 접속 정보와 같은 민감한 정보(Credentials)를 안전하게 관리해야 한다. 이러한 정보를 소스 코드에 직접 포함시키는 것은 Git과 같은 버전 관리 시스템을 통해 외부에 노출될 위험이 있다.[7] 환경 변수는 코드와 민감 정보를 분리하여 관리할 수 있는 효과적인 방법 중 하나이다. 설정 파일을 사용하는 방법도 있지만, 파일 형태는 실수로 커밋될 가능성이 있다. 환경 변수는 파일이 아니므로 이러한 위험이 적고,[9] 애플리케이션 외부에서 데이터를 주입하는 방식이 단순하며, 다양한 프로그래밍 언어나 운영 체제 환경에서 비교적 쉽게 이식될 수 있다는 장점이 있다.[8] 특히 클라우드 네이티브 애플리케이션 개발에서는 환경 변수를 통해 기밀 정보를 전달하는 것이 일반적인 모범 사례로 권장된다.[10]

5. 2. 소프트웨어 실행

모든 유닉스유닉스 계열 시스템과 윈도우에서 각 프로세스는 자신만의 환경 변수 설정을 가진다. 기본적으로 프로세스는 생성될 때 부모 프로세스의 런타임 환경을 복제하여 상속받는다. 다만, 부모 프로세스가 자식 프로세스를 만들 때 환경 변수를 명시적으로 변경할 수는 있다. API 수준에서는 이러한 변경이 `fork`와 `exec` 호출 사이에 이루어진다.

명령 셸(예: bash)에서는 사용자가 특정 명령어 실행 시 환경 변수를 변경할 수 있다. `ENVIRONMENT_VARIABLE=VALUE <명령어>` 형식을 사용하거나 `env` 명령어를 통해 간접적으로 설정할 수 있다. 실행 중인 프로그램은 이러한 환경 변수의 값에 접근하여 자신의 동작 방식을 설정하거나 변경하는 데 활용할 수 있다. 예를 들어, 특정 라이브러리가 위치한 경로를 지정하거나, 설정 파일의 위치를 알려주는 등의 용도로 사용된다.

셸 스크립트배치 파일은 환경 변수를 사용하여 자식 프로세스에게 필요한 데이터나 설정을 전달하는 수단으로 활용한다. 스크립트 내에서 임시 값을 저장하는 용도로도 사용될 수 있다.
소프트웨어 실행 경로 및 라이브러리 설정환경 변수는 소프트웨어가 필요한 파일이나 라이브러리를 찾는 데 중요한 역할을 한다.

  • 실행 파일 경로:
  • 유닉스/유닉스 계열: `$PATH` 환경 변수는 이 사용자가 입력한 명령어를 찾기 위해 검색할 디렉터리 목록을 콜론(`:`)으로 구분하여 가지고 있다.
  • 윈도우: `%PATH%` 환경 변수가 동일한 역할을 하며, 디렉터리 목록을 세미콜론(`;`)으로 구분한다. 명령 인터프리터는 이 경로들을 순서대로 탐색하여 실행 파일을 찾는다.
  • 동적 라이브러리 경로 (유닉스/유닉스 계열):
  • `$LD_LIBRARY_PATH` 환경 변수는 프로그램 실행 시 필요한 공유 라이브러리를 찾을 디렉터리 경로를 지정하는 데 사용된다.
  • `$LD_PRELOAD`는 다른 모든 라이브러리보다 먼저 로드될 특정 라이브러리를 지정한다.
  • 주의: setuid 프로그램은 보안상의 이유로 이러한 변수(`$LD_LIBRARY_PATH`, `$LD_PRELOAD`)의 영향을 받지 않도록 설계되었다. 동적 링커는 setuid 프로그램 실행 시 이 변수들을 무시하거나 초기화하여, 권한 상승 공격에 악용될 가능성을 차단한다.[1] 이는 시스템 보안을 유지하기 위한 중요한 조치이다. setuid 프로그램은 일반적으로 신뢰할 수 없는 환경 변수를 제거하고 필요한 변수만 확인하여 사용한다.

윈도우의 주요 관련 환경 변수윈도우 환경에서는 다음과 같은 환경 변수들이 소프트웨어 실행 및 설정에 자주 사용된다.

  • `%APPDATA%`: 현재 로그인한 사용자의 응용 프로그램 데이터 디렉터리 경로이다. 사용자별 설정을 저장하는 데 사용된다.[1]
  • `%LOCALAPPDATA%`: 로컬 컴퓨터에 저장되는 임시 응용 프로그램 데이터 경로이다. 캐시 파일이나 사용자별 임시 설정 등이 저장된다.[1]
  • `%ProgramFiles%`, `%ProgramFiles(x86)%`, `%ProgramW6432%`: 설치된 프로그램들이 위치하는 기본 디렉터리 경로이다. 64비트 윈도우에서는 32비트와 64비트 프로그램 경로가 구분되어 관리된다.[2]
  • `%SystemRoot%`, `%windir%`: 윈도우 시스템 파일이 설치된 루트 디렉터리 경로이다. 운영체제의 핵심 파일들이 위치한다.
  • `%ComSpec%`: cmd.exe 또는 COMMAND.COM 같은 명령 처리기의 전체 경로를 가리킨다.


이처럼 환경 변수는 운영체제와 응용 프로그램 사이의 중요한 소통 수단으로, 소프트웨어의 실행 환경을 구성하고 동작 방식을 제어하는 데 필수적인 역할을 한다.

5. 3. 시스템 관리

시스템 관리자는 환경 변수를 활용하여 시스템의 전반적인 설정을 관리하고 프로세스의 동작 환경을 제어할 수 있다.

유닉스유닉스 계열 시스템에서는 시스템이 시작될 때 init 시작 스크립트 등을 통해 기본적인 환경 변수들이 설정된다. 이렇게 설정된 환경 변수들은 시스템에서 실행되는 다른 모든 프로세스에게 상속된다. 사용자는 자신이 사용하는 명령 셸의 프로필 스크립트(예: `.bashrc`, `.profile`)를 통해 환경 변수를 추가하거나 수정하여 개인적인 작업 환경을 구성할 수 있다.[3][4]

윈도우에서는 각 환경 변수의 기본값이 윈도우 레지스트리에 저장되어 관리된다. 과거 DOS 시절이나 초기 윈도우 버전에서는 `AUTOEXEC.BAT` 파일이 환경 변수를 설정하는 데 사용되기도 했다.

환경 변수는 부모 프로세스에서 자식 프로세스로 복제되어 상속되는 특징을 가진다. 따라서 시스템 관리자가 시스템 전역적으로 설정한 환경 변수(예: 실행 파일 검색 경로를 지정하는 `PATH` 변수)는 해당 시스템에서 실행되는 대부분의 응용 프로그램에 영향을 미치게 된다. 다만, 자식 프로세스에서 환경 변수를 변경하더라도 이는 해당 자식 프로세스와 그 자식 프로세스에게만 영향을 줄 뿐, 부모 프로세스나 다른 관련 없는 프로세스의 환경에는 영향을 미치지 않는다.

셸 스크립트(유닉스)나 배치 파일(윈도우)을 작성할 때 환경 변수는 유용하게 사용된다. 스크립트 내에서 임시 데이터를 저장하거나, 스크립트가 실행하는 다른 프로그램(자식 프로세스)에게 설정값이나 필요한 정보를 전달하는 수단으로 활용될 수 있다. 이를 통해 반복적인 시스템 관리 작업을 자동화하는 것이 가능하다.

환경 변수는 시스템 보안과도 밀접한 관련이 있다. 예를 들어, 유닉스 시스템의 setuid 프로그램은 일반 사용자가 프로그램 소유자(주로 root)의 권한으로 특정 작업을 수행할 수 있도록 허용하는 기능이다. 만약 사용자가 조작한 환경 변수(특히 동적 라이브러리 로딩 경로를 지정하는 `$LD_LIBRARY_PATH`나 `$LD_PRELOAD` 등)가 `setuid` 프로그램에 그대로 전달된다면, 공격자는 이를 악용하여 시스템 권한을 탈취할 수도 있다. 이러한 보안 위협을 완화하기 위해, 시스템의 표준 C 라이브러리(libc)는 `setuid` 프로그램이 실행될 때 잠재적으로 위험한 환경 변수들을 자동으로 제거하거나 안전한 값으로 초기화하는 등의 보안 조치를 취한다. 시스템 관리자는 이러한 환경 변수 관련 보안 메커니즘을 이해하고 시스템 환경을 안전하게 구성해야 한다.

윈도우 환경에서 시스템 관리 및 일반적인 작업에 자주 사용되는 환경 변수들의 예시는 다음과 같다. 이 변수들은 명령 프롬프트나 파워셸, 또는 시스템 속성 창을 통해 확인하고 관리할 수 있다.

변수로케일 관련 여부Windows XP (CMD)Windows Vista 이상 (CMD)
%ALLUSERSPROFILE%C:\Documents and Settings\All UsersC:\ProgramData
%APPDATA%C:\Documents and Settings\{username}\Application DataC:\Users\{username}\AppData\Roaming
%CommonProgramFiles%C:\Program Files\Common FilesC:\Program Files\Common Files
%CommonProgramFiles(x86)%C:\Program Files (x86)\Common Files (64비트 버전에서만)C:\Program Files (x86)\Common Files (64비트 버전에서만)
%CommonProgramW6432%%CommonProgramW6432% (지원되지 않으며, 값으로 대체되지 않음)C:\Program Files\Common Files (64비트 버전에서만)
%COMPUTERNAME%아니요{computername}{computername}
%ComSpec%아니요C:\Windows\System32\cmd.exeC:\Windows\System32\cmd.exe
%HOMEDRIVE%아니요C:C:
%HOMEPATH%\Documents and Settings\{username}\Users\{username}
%LOCALAPPDATA%%LOCALAPPDATA% (지원되지 않으며, 값으로 대체되지 않음)C:\Users\{username}\AppData\Local
%LOGONSERVER%아니요\\{domain_logon_server}\\{domain_logon_server}
%PATH%C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;{plus program paths}C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;{plus program paths}
%PATHEXT%아니요.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.WSF;.WSH.com;.exe;.bat;.cmd;.vbs;.vbe;.js;.jse;.wsf;.wsh;.msc
%ProgramData%%ProgramData% (지원되지 않으며, 값으로 대체되지 않음)%SystemDrive%\ProgramData
%ProgramFiles%%SystemDrive%\Program Files%SystemDrive%\Program Files
%ProgramFiles(x86)%%SystemDrive%\Program Files (x86) (64비트 버전에서만)%SystemDrive%\Program Files (x86) (64비트 버전에서만)
%ProgramW6432%%ProgramW6432% (지원되지 않으며, 값으로 대체되지 않음)%SystemDrive%\Program Files (64비트 버전에서만)
%PROMPT%아니요현재 명령 프롬프트 형식의 코드, 일반적으로 $P$G현재 명령 프롬프트 형식의 코드, 일반적으로 $P$G
%PSModulePath%%PSModulePath% (지원되지 않으며, 값으로 대체되지 않음)%SystemRoot%\system32\WindowsPowerShell\v1.0\Modules\
%PUBLIC%%PUBLIC% (지원되지 않으며, 값으로 대체되지 않음)%SystemDrive%\Users\Public
%SystemDrive%아니요C:C:
%SystemRoot%아니요Windows 디렉터리, 일반적으로 C:\Windows, 이전에는 C:\WINNT%SystemDrive%\Windows
%TEMP% 및 %TMP%%SystemDrive%\Documents and Settings\{username}\Local Settings\Temp%SystemRoot%\TEMP (시스템 환경 변수 %TMP% 및 %TEMP%의 경우), %USERPROFILE%\AppData\Local\Temp (사용자 환경 변수 %TMP% 및 %TEMP%의 경우)
%USERDOMAIN%아니요{userdomain}{userdomain}
%USERNAME%아니요{username}{username}
%USERPROFILE%%SystemDrive%\Documents and Settings\{username}%SystemDrive%\Users\{username}
%windir%아니요%SystemDrive%\WINDOWS%SystemDrive%\Windows



이러한 환경 변수들은 시스템의 경로 설정, 사용자 프로필 위치 지정, 임시 파일 저장 위치 지정 등 다양한 시스템 관리 작업에 활용된다. 예를 들어, `%USERNAME%`이나 `%USERPROFILE%` 변수는 사용자 계정 관리 스크립트에서 특정 사용자에게 적용되는 설정을 구성하는 데 사용될 수 있다. `%PATH%` 변수는 시스템 관리자가 특정 도구나 유틸리티를 시스템 어디서든 쉽게 실행할 수 있도록 경로를 추가하는 데 사용된다.

6. DOS, OS/2 및 Windows에서의 환경 변수

도스, OS/2, 윈도우 환경에서는 환경 변수를 설정하고 사용하기 위한 자체적인 규칙과 명령어가 존재한다.

=== 기본 사용법 ===

명령 프롬프트(COMMAND.COM 또는 CMD.EXE)에서 환경 변수를 다루는 기본적인 명령어는 `SET`이다.


  • 모든 환경 변수 조회: `SET` 명령어 뒤에 아무런 인수 없이 실행하면 현재 설정된 모든 환경 변수와 그 값을 보여준다. 윈도우 NT 이후 버전에서는 특정 문자열로 시작하는 변수만 필터링하여 볼 수도 있다.



SET

SET H :: 'H'로 시작하는 모든 변수 표시 (예: HOMEDRIVE, HOMEPATH)


  • 변수 설정: 특정 변수에 값을 할당하려면 `=` 기호를 사용한다. 변수 이름은 대소문자를 구분하지 않는다.



SET 변수명=값

SET MY_VARIABLE=Hello World


  • 변수 제거: 변수 이름 뒤에 `=`만 입력하면 해당 변수가 환경에서 제거된다.



SET 변수명=

SET MY_VARIABLE=


  • 변수 값 사용: 설정된 환경 변수의 값은 변수 이름을 `%` 기호로 감싸서 참조한다. 존재하지 않는 변수를 참조하면 빈 문자열로 처리된다.



ECHO %PATH%

ECHO 현재 사용자의 홈 경로는 %HOMEDRIVE%%HOMEPATH% 입니다.



=== 로컬 변수 ===

`CMD.EXE`에서는 `SETLOCAL`과 `ENDLOCAL` 명령어를 사용하여 배치 파일 내에서 환경 변수의 변경 사항을 지역화할 수 있다. `SETLOCAL` 이후에 변경된 환경 변수(새로 생성되거나 수정된 변수)는 `ENDLOCAL` 명령어를 만나면 `SETLOCAL` 이전 상태로 복원된다. 이를 통해 배치 파일 실행이 끝난 후 원래 환경을 유지할 수 있다.



@ECHO OFF

SET VAR=Global Value

ECHO Before SETLOCAL: %VAR%

SETLOCAL

SET VAR=Local Value

ECHO Inside SETLOCAL/ENDLOCAL: %VAR%

ENDLOCAL

ECHO After ENDLOCAL: %VAR%



=== DOS 환경의 특징 ===

DOS 환경에서 환경 변수는 몇 가지 특징을 가진다.

  • 환경 영역: DOS는 '마스터 환경'과 '로컬 환경' 개념을 사용한다. 마스터 환경은 기본 명령 처리기(`COMMAND.COM`)가 시작될 때 `CONFIG.SYS` 파일 등을 통해 설정된 '사전 환경'을 상속받는다. 자식 프로세스가 생성될 때는 부모 프로세스의 환경을 복사하여 '로컬 환경'을 가지게 된다.
  • 크기 제한: 환경 영역의 크기는 제한적이며, `COMMAND.COM` 실행 시 `/E:` 매개변수를 통해 크기를 조절할 수 있었다. (예: `COMMAND /E:1024`는 1024 바이트 환경 공간 할당) 환경 변수의 내용 길이도 제한이 있을 수 있으며, 일부 오래된 프로그램은 128자를 초과하는 값을 제대로 처리하지 못할 수 있다.
  • 대소문자 구분 없음: DOS, OS/2, 윈도우에서는 환경 변수 이름의 대소문자를 구분하지 않는다. `SET path=C:\DOS`와 `SET PATH=C:\DOS`는 동일하게 취급된다. 다만, 저장될 때는 일반적으로 대문자로 변환되는 경우가 많았다. MS-DOS 7.0부터는 `%windir%`와 같이 소문자 변수 이름도 내부적으로 지원했지만, 사용자가 직접 소문자 변수를 정의하는 표준적인 방법은 제공되지 않았다.


=== 주요 예약 변수 ===

DOS와 Windows 시스템에는 미리 정의되어 특별한 용도로 사용되는 여러 환경 변수가 있다. 주요 변수는 다음과 같다.

변수명설명주요 사용 OS/버전
`%APPEND%`데이터 파일을 검색할 디렉토리 목록 (세미콜론 구분). `APPEND /E` 명령으로 관리. | DOS 3.3+
`%CONFIG%``CONFIG.SYS`의 `MENUITEM`으로 정의된 현재 부팅 구성의 이름. | MS-DOS 6.0+, PC DOS 6.1+
`%CMDLINE%`4DOS, MS-DOS 7.0+
`%COMSPEC%`기본 명령 처리기(COMMAND.COM, CMD.EXE)의 전체 경로. 시스템이 셸을 다시 로드할 때 사용. | DOS 2.0+
`%COPYCMD%``COPY`, `XCOPY`, `MOVE` 명령의 기본 스위치 설정 (예: `/Y` - 덮어쓰기 시 확인 안 함). | MS-DOS 6.2+, PC DOS 6.3+
`%DIRCMD%``DIR` 명령 실행 시 기본적으로 적용될 옵션 설정. | MS-DOS 5.0+, PC DOS 5.0+
`%HOMEDRIVE%`Windows NT 계열
`%HOMEPATH%`Windows NT 계열
`%PATH%`실행 파일(EXE, COM, BAT 등)을 찾기 위한 디렉토리 검색 경로 목록 (세미콜론 구분). | DOS 2.0+
`%PROMPT%`명령 프롬프트의 모양을 정의하는 문자열. `PROMPT` 명령으로 설정. | DOS 2.0+
`%TEMP%` / `%TMP%`DOS/Windows
`%OS%`운영 체제의 종류를 나타냄 (예: `Windows_NT`). DR-DOS에서도 동명의 변수가 다른 의미로 사용됨. | Windows NT 계열
`%windir%`Windows



DR-DOS는 위 변수들 외에도 `%DRDOSCFG%`, `%VER%`, `%YESCHAR%`, `%NOCHAR%` 등 자체적인 추가 표준 환경 변수들을 다수 지원했다.

=== Windows PowerShell ===

Windows PowerShell에서는 환경 변수를 관리하는 방식이 다소 다르다. 환경 변수는 `Env:` 드라이브에 저장된 항목으로 취급된다.


  • 변수 값 조회: 변수 이름 앞에 `$env:` 접두사를 붙여 참조한다. 이름은 대소문자를 구분하지 않는다.



# 홈 드라이브와 경로 출력 (세 가지 방법 모두 동일 결과)

echo $env:homedrive$env:homepath

Write-Output $env:homedrive$env:homepath

"$env:homedrive$env:homepath"


  • 모든 변수 조회: `Get-ChildItem` (또는 별칭 `gci`, `ls`, `dir`) cmdlet을 사용한다.



Get-ChildItem Env:

gci env:

ls env:

dir env:


  • 변수 설정: `=` 연산자를 사용하여 값을 할당한다.



$env:MY_VARIABLE = "PowerShell Value"


  • 변수 제거: `Remove-Item` (또는 별칭 `del`, `rm`, `erase`) cmdlet을 사용한다.



Remove-Item Env:MY_VARIABLE

del env:MY_VARIABLE



=== 영구 설정 ===

명령 프롬프트나 배치 파일에서 `SET` 명령으로 변경한 환경 변수는 해당 명령 프롬프트 세션이나 배치 파일 실행 중에만 유효하다. 시스템을 재시작하거나 새 명령 프롬프트 창을 열면 변경 사항이 사라진다.

  • DOS/구 버전 Windows: 변경 사항을 영구적으로 적용하려면 AUTOEXEC.BAT 파일에 `SET` 명령어를 추가해야 했다. 시스템이 부팅될 때 이 파일이 자동으로 실행되어 환경 변수를 설정한다.
  • Windows NT 계열: 윈도우 레지스트리에 환경 변수 값을 저장하거나, '시스템 속성'의 '고급 시스템 설정' -> '환경 변수' 메뉴를 통해 영구적으로 설정할 수 있다.


=== 유사 환경 변수 ===

일부 명령 처리기(예: 4DOS, `CMD.EXE`)는 실제 환경 변수처럼 `%` 기호로 참조할 수 있지만 환경 공간에 저장되지 않고 요청 시 동적으로 계산되는 '유사 환경 변수'(Pseudo environment variables) 또는 '내부 변수'를 지원한다. 예를 들어 `%DATE%`, `%TIME%`, `%RANDOM%`, `%CD%` (현재 디렉토리), `%ERRORLEVEL%` (마지막 명령어 종료 코드) 등이 있다. 이들은 `SET` 명령 목록에는 나타나지 않을 수 있다.

7. 유닉스 환경 변수

모든 유닉스유닉스 계열 시스템과 윈도우에서 각 프로세스는 자신만의 환경 변수 집합을 가진다. 기본적으로 프로세스가 생성될 때, 부모 프로세스가 명시적으로 변경하지 않는 한 부모 프로세스의 런타임 환경 복사본을 상속받는다. API 수준에서는 `fork`와 `exec` 호출 사이에서 이러한 변경이 이루어진다. bash와 같은 명령 셸에서는 `env` 명령어를 통하거나 `ENVIRONMENT_VARIABLE=VALUE <명령어>` 구문을 사용하여 특정 명령어 호출에 대한 환경 변수를 변경할 수 있다. 실행 중인 프로그램은 환경 변수 값을 읽어 설정을 구성하는 데 사용할 수 있다.

셸 스크립트는 환경 변수를 사용하여 자식 프로세스에 데이터와 설정을 전달하고, 임시 값을 저장하는 데 사용될 수 있다. 그러나 유닉스에서는 프로세스 외부로 유출되지 않는 내보내지 않은 변수(unexported variable)가 이러한 목적에 더 선호된다. 유닉스에서 스크립트나 컴파일된 프로그램이 환경 변수를 변경하면 해당 변경 사항은 그 프로세스와 잠재적인 자식 프로세스에만 영향을 미치며, 부모 프로세스나 관련 없는 프로세스에는 영향을 주지 않는다.

유닉스 시스템에서는 일반적으로 시스템 시작 시 init 시작 스크립트에 의해 환경 변수가 초기화되어 시스템의 다른 모든 프로세스에 상속된다. 사용자는 자신이 사용하는 명령 셸의 프로필 스크립트에서 이를 추가하거나 수정할 수 있다.

환경 변수 모음은 일반적으로 키와 값 모두 문자열인 연관 배열처럼 작동한다. 목록과 같은 데이터 구조를 나타낼 때는 콜론(`:`)으로 구분된 목록을 사용하는 것이 일반적이다. 환경 변수 이름은 일반적으로 모두 대문자로 사용하는 것이 관례이며, 이는 코드 내 다른 종류의 이름과 구별하는 데 도움이 된다. 유닉스 계열 운영체제에서는 환경 변수 이름의 대소문자를 구분한다.

=== 변수 확인 ===

`env`, `set`, 그리고 `printenv` 명령어들은 인자 없이 사용하면 모든 환경 변수와 그 값을 보여준다. `printenv` 명령어는 변수 이름을 인자로 전달하여 특정 변수의 값만 출력하는 데 사용할 수도 있다. `set` 명령어는 환경 변수뿐만 아니라 현재 셸에만 정의된 셸 변수도 함께 보여준다.



printenv HOME # $HOME 환경 변수의 값을 출력한다.

env # 모든 환경 변수를 출력한다.

set # 모든 환경 변수와 셸 변수를 출력한다.



=== 변수 설정 및 내보내기 ===

`env`와 `set` 명령어는 환경 변수를 설정하는 데에도 사용될 수 있으며, 종종 셸에 내장된 기능으로 제공된다.

유닉스 셸에서는 다음과 같은 방법으로 변수를 설정하고 내보낼 수 있다. 명령어는 사용하는 셸의 종류에 따라 다를 수 있다.


  • `''변수''=''값''` : 변수를 할당한다. 등호(`=`) 주변에는 공백이 없어야 한다. 이렇게 할당된 변수는 셸 변수로, 현재 셸 내부에서만 유효하며 `set` 명령어로 확인할 수 있다. 자식 프로세스에는 상속되지 않으므로 엄밀히 말해 환경 변수는 아니다. `printenv` 명령어는 이러한 셸 변수를 표시하지 않는다.
  • `export ''변수''` : 이미 설정된 셸 변수를 환경 변수로 만들어 자식 프로세스에 상속되도록 한다. (본 셸, bash 등)
  • `export ''변수''=''값''` : 변수를 설정함과 동시에 환경 변수로 내보낸다. (ksh, bash 등)
  • `setenv ''변수'' ''값''` : 환경 변수를 설정한다. (csh 및 관련 셸)


환경 변수는 설정된 프로세스에 국한된다. 즉, 한 셸에서 환경 변수 값을 변경해도 다른 셸 프로세스에는 영향을 미치지 않는다. 자식 프로세스는 생성될 때 부모 프로세스의 모든 환경 변수와 값을 상속받는다. 프로그램이 다른 프로그램을 호출할 때는 일반적으로 먼저 fork를 통해 자식 프로세스를 생성하고, 자식 프로세스가 필요에 따라 환경을 조정한 후 exec를 통해 자신을 호출할 프로그램으로 대체한다. 이 과정을 통해 호출하는 프로그램은 호출되는 프로그램의 환경을 제어할 수 있다.

접두사 구문을 사용하면 현재 프로세스에 영향을 주지 않고 자식 프로세스에만 특정 환경 변수를 설정하여 전달할 수 있다.



VARIABLE=value program_name [arguments] # program_name을 실행할 때만 VARIABLE을 value로 설정



=== 변수 사용 ===

대부분의 유닉스 및 유닉스 계열 명령 줄 셸에서는 변수 이름 앞에 `$` 기호를 붙여 환경 변수의 값을 참조한다. 필요한 경우 변수 이름을 중괄호(`{}`)로 묶을 수도 있다.

예를 들어, 사용자의 홈 디렉터리를 표시하려면 다음과 같이 입력한다.



echo $HOME



=== 변수 해제 ===

`unset` 명령어는 본 셸 계열(sh, ksh, bash 등)과 C 셸 계열(csh, tcsh 등)의 유닉스 명령줄 셸 모두에서 지원하는 내장 명령어이다. 이 명령어는 셸 변수나 환경 변수를 해제하여 메모리와 셸의 내보낸 환경에서 제거한다. 셸 내부를 직접 조작하므로 셸 내장 명령어로 구현되어 있다. 읽기 전용으로 설정된 변수는 해제할 수 없으며, 시도할 경우 오류 메시지가 출력되고 0이 아닌 종료 코드가 반환된다.



unset VARIABLE # VARIABLE 변수를 해제한다.



=== 주요 환경 변수 ===

유닉스 시스템에서 자주 사용되는 주요 환경 변수는 다음과 같다.

;$PATH

: 셸이 명령어를 찾을 때 검색하는 디렉터리 경로 목록이다. 각 경로는 콜론(`:`)으로 구분된다. 슬래시(`/`)를 포함하지 않는 명령어 이름이 입력되면, 셸은 `$PATH`에 지정된 디렉터리를 순서대로 검색하여 실행 파일을 찾는다. 슬래시를 포함하는 명령어는 특정 경로의 파일로 간주되어 직접 실행된다. MS-DOS, OS/2, 윈도우의 `%PATH%` 변수와 동일하다.

;$HOME

: 현재 사용자의 홈 디렉터리 경로를 나타낸다. C 함수 `getpwuid`나 `getuid`를 통해서도 홈 디렉터리를 알 수 있지만, 셸 스크립트 등 다양한 상황에서 편의를 위해 `$HOME` 변수가 자주 사용된다. 사용자가 이 변수 값을 변경하여 다른 디렉터리를 홈 디렉터리처럼 사용하게 할 수도 있다.

;$PWD

: 현재 작업 중인 디렉터리(Present Working Directory)의 경로를 나타낸다. `pwd` 명령어를 인자 없이 실행했을 때 출력되는 내용과 동일하다.

;$DISPLAY

: X11 그래픽 환경에서 프로그램이 기본적으로 연결해야 할 디스플레이 서버를 지정한다. 일반적으로 `호스트명:디스플레이번호.스크린번호` 형식이다.

;$LD_LIBRARY_PATH

: 동적 링커를 사용하는 많은 유닉스 시스템에서, 프로그램 실행 시 필요한 공유 객체(공유 라이브러리)를 찾는 데 사용되는 디렉터리 경로 목록이다. 콜론(`:`)으로 구분되며, 시스템 기본 라이브러리 경로보다 먼저 검색된다. 보안상의 이유로 setuid 프로그램 실행 시에는 이 변수가 무시되거나 해제되는 경우가 많다.

;$LIBPATH 또는 $SHLIB_PATH

: 일부 오래된 유닉스 버전에서 `$LD_LIBRARY_PATH` 대신 사용되던 변수이다.

;$LANG, $LC_ALL, $LC_...

: 프로그램의 로케일 설정을 제어한다.

:* `$LANG`: 기본적인 로케일을 설정한다. 예를 들어 `ko_KR.UTF-8`로 설정하면 한국어와 한국 관련 설정을 사용한다.

:* `$LC_CTYPE`: 문자 분류 및 대소문자 변환 규칙을 설정한다.

:* `$LC_COLLATE`: 문자열 정렬 순서를 설정한다.

:* `$LC_TIME`: 날짜 및 시간 표시 형식을 설정한다.

:* `$LC_NUMERIC`: 숫자 표시 형식(소수점, 천 단위 구분 기호 등)을 설정한다.

:* `$LC_MONETARY`: 통화 표시 형식을 설정한다.

:* `$LC_MESSAGES`: 프로그램 메시지에 사용될 언어를 설정한다.

:* `$LC_ALL`: 모든 `LC_*` 설정을 `$LC_ALL` 값으로 강제한다. 이 변수가 설정되면 다른 `LC_*` 변수나 `$LANG` 변수보다 우선 적용된다.

;$TZ

: 시스템의 시간대 설정을 지정한다. 시간대 이름(예: `Asia/Seoul`)을 직접 지정하거나, `/usr/share/zoneinfo` 디렉터리 아래의 시간대 정보 파일을 참조하는 방식으로 사용될 수 있다.

;$BROWSER

: 사용자가 선호하는 웹 브라우저 목록을 콜론(`:`)으로 구분하여 지정한다. URL을 열어야 하는 프로그램은 이 목록에 있는 브라우저를 순서대로 시도하여 처음 성공하는 브라우저를 사용한다. 이를 통해 X11 환경에서는 파이어폭스 같은 그래픽 브라우저를, 콘솔 환경에서는 Lynx 같은 텍스트 기반 브라우저를 사용하는 등 상황에 맞는 브라우저를 선택할 수 있다. `%s` 토큰이 있으면 해당 위치에 URL이 삽입되고, 없으면 URL이 브라우저 명령어의 첫 번째 인자로 전달된다.

=== 보안 고려 사항 ===

유닉스에서 setuid 프로그램은 호출한 사용자와 다른 권한(대개 더 높은 권한)으로 실행된다. 이때 호출자가 설정한 환경 변수를 그대로 사용하면 보안 문제가 발생할 수 있다. 예를 들어, 동적 링커는 `$LD_LIBRARY_PATH`나 `$LD_PRELOAD` 환경 변수에 지정된 경로에서 라이브러리를 로드하는데, 악의적인 사용자가 이 변수를 조작하여 임의의 코드를 높은 권한으로 실행시킬 수 있다. 이러한 위험 때문에 시스템 라이브러리(예: libc)는 `setuid` 프로그램이 시작될 때 `$LD_LIBRARY_PATH`와 같은 위험한 환경 변수를 자동으로 해제하거나 무시한다. `setuid` 프로그램 자체도 일반적으로 알 수 없는 환경 변수를 해제하고, 다른 필요한 변수는 확인하거나 합리적인 값으로 설정하는 것이 안전하다.

8. HTTP 환경 변수

웹 브라우저와 같은 HTTP 사용자 에이전트서버에 접속할 때, 다양한 정보를 담은 HTTP 요청 헤더를 함께 보낸다. 만약 요청된 리소스가 프로그램(예: CGI, PHP, Java)이라면, 서버는 일반적으로 클라이언트의 IP 주소나 HTTP 요청 헤더의 정보를 환경 변수로 설정하여 해당 프로그램을 실행시킨다. HTTP 요청 헤더의 정보는 각 헤더 필드명에 해당하는 이름의 환경 변수로 전달된다.

이러한 방식은 "The Common Gateway Interface (CGI) Version 1.1"의 4.1절 'Request Meta-Variables'에 정의되어 있으며, Python[5]이나 Ruby[6] 같은 프로그래밍 언어에서도 이 규정을 참조한다.

HTTP 환경 변수로 사용되는 주요 정보
정보요청 헤더환경 변수
클라이언트의 IP 주소(없음)REMOTE_ADDR
클라이언트의 역방향 호스트 이름(없음)REMOTE_HOST
클라이언트의 TCP 포트 번호(없음)REMOTE_PORT
사용자 에이전트가 수용 가능한 MIME 미디어 타입Accept:HTTP_ACCEPT
사용자 에이전트가 수용 가능한 문자 인코딩Accept-Charset:HTTP_ACCEPT_CHARSET
사용자 에이전트가 수용 가능한 언어Accept-Language:HTTP_ACCEPT_LANGUAGE
서버의 호스트 이름Host:HTTP_HOST
사용자 에이전트의 리퍼러Referer:HTTP_REFERER
사용자 에이전트 식별 정보User-Agent:HTTP_USER_AGENT



간혹 이러한 메커니즘을 두고 "브라우저가 환경 변수를 보낸다"고 표현하는 경우가 있지만, 이는 정확하지 않다. 실제로는 사용자 에이전트(브라우저)가 직접 환경 변수를 보내는 것이 아니라, 웹 서버가 사용자 에이전트로부터 받은 정보를 바탕으로 환경 변수를 설정하여 프로그램을 실행하는 것이다.

9. 환경 변수 사용 시 주의사항

유닉스 계열 은 유사한 동적으로 생성된 변수를 가지며, bash의 $RANDOM이 잘 알려진 예시이다. 하지만, 이 셸들은 지역 변수 개념을 가지고 있으므로, 특수 지역 변수로 설명된다.

참조

[1] 웹사이트 Recognized environment variables - Windows Deployment https://learn.micros[...] 2024-01-09
[2] 웹사이트 WOW64 Implementation Details https://msdn.microso[...]
[3] 간행물 Federal Information Processing Standards Publication: for information systems - programming language - C (ANSI X3.159-1989, §F.5.1 Environment Arguments) https://nvlpubs.nist[...] NIST Technical Series Publications
[4] 웹사이트 for Programming Languages - C (ISO/IEC 9899:1990, §G.5.1 Environment arguments) https://web.archive.[...]
[5] 웹사이트 PEP 333 -- Python Web Server Gateway Interface v1.0 https://www.python.o[...] 2017-03-26
[6] 웹사이트 File: SPEC — Documentation for rack/rack (master) http://www.rubydoc.i[...] 2017-03-26
[7] 웹사이트 The Twelve-Factor App - III. 설정 https://12factor.net[...]
[8] 웹사이트 The Twelve-Factor App https://12factor.net[...]
[9] 웹사이트 The Twelve-Factor App https://12factor.net[...]
[10] 웹사이트 The Twelve-Factor App - III. 설정 https://12factor.net[...]
[11] 웹사이트 Store and retrieve settings and other app data https://docs.microso[...] 마이크로소프트 2017-12-18



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com